package elm.entity.po;

import elm.entity.po.vo.UserRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.Optional;

/**
 * 用户实体类（Persistence Object）
 * 对应数据库表中的用户信息
 * 包含用户基础信息字段及持久化注解
 */
@Schema(description = "用户实体类，包含用户基础信息及持久化映射字段")
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    /**
     * 用户唯一标识符
     * 数据库主键，自增策略采用IDENTITY模式
     */
    @Schema(description = "用户唯一ID，数据库自增主键")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    /**
     * 用户手机号
     * 格式要求：11位数字字符串
     * 唯一约束：系统中每个手机号仅可注册一次
     */
    @Schema(description = "用户手机号，11位数字字符串格式，唯一约束")
    private String phone;

    /**
     * 用户密码
     * 存储格式：BCrypt加密后的密文
     * 安全要求：禁止明文存储原始密码
     */
    @Schema(description = "用户密码，BCrypt加密后的密文格式")
    private String password;

    /**
     * 用户姓名
     * 最大长度限制：50个字符
     */
    @Schema(description = "用户姓名，最大长度50个字符")
    private String name;

    /**
     * 用户地址信息
     * 最大长度限制：200个字符
     */
    @Schema(description = "用户地址信息，最大长度200个字符")
    private String address;

    /**
     * 用户创建时间
     * 自动记录用户账户创建的精确时间
     */
    @Schema(description = "用户账户创建时间，自动记录的时间戳")
    private LocalDateTime createdAt;

    /**
     * 用户性别
     * 取值范围：MALE/FEMALE/UNKNOWN
     * 默认值：UNKNOWN
     */
    @Schema(description = "用户性别，取值范围：MALE/FEMALE/UNKNOWN，默认UNKNOWN")
    private String sex;

    /**
     * 构造方法 - 从请求对象创建用户实例
     * 用于注册新用户时的数据转换
     * 
     * @param userRequest 请求参数封装对象
     */

    public User(UserRequest userRequest) {
        this.phone = userRequest.getPhone();
        this.password = userRequest.getPassword();
        this.sex = userRequest.getSex();
    }

}